#include "MY_INC/PHY/PHY_SignalAnalysisr.h"

//*********** Macro Definition ***********//

/**
 * @brief 正弦波分析器的核心算法宏定义。
 * @param v 指向正弦波分析器结构体的指针。
 */
void ThreePhaseSignalAnalysisr_Init(ThreePhaseSignalAnalysisr_Typedef *v, float SampleFreq, float Threshold,
                                    uint32_t nsamplesMin,
                                    uint32_t nsamplesMax) // 初始化结构体（带采样数限制）
{
    // 输入参数
    SignalAnalysisr_Init(&(v->Phase[0]), SampleFreq, Threshold, nsamplesMin, nsamplesMax);
    SignalAnalysisr_Init(&(v->Phase[1]), SampleFreq, Threshold, nsamplesMin, nsamplesMax);
    SignalAnalysisr_Init(&(v->Phase[2]), SampleFreq, Threshold, nsamplesMin, nsamplesMax);
}
// 核心处理函数(在50kHz中断中调用)

static inline void SignalAnalysisr_Reset_Inline(SignalAnalysisr_Typedef *v);
void SignalAnalysisr_Init(SignalAnalysisr_Typedef *v, float SampleFreq, float Threshold, uint32_t nsamplesMin,
                          uint32_t nsamplesMax) // 初始化结构体（带采样数限制）
{
    if (v == NULL)
        return; // 检查指针是否为 NULL
    memset(v, 0, sizeof(SignalAnalysisr_Typedef));

    v->SampleFreq = SampleFreq;  // 输入：信号采样频率（Hz）
    v->nsamplesMin = nsamplesMin; // 内部：周期采样数下限（防噪声干扰）
    v->nsamplesMax = nsamplesMax; // 内部：周期采样数上限（防异常信号）
    v->inv_nsamples = 1.0f / BUFFER_SIZE;
    v->buffer_size = BUFFER_SIZE;
    v->SigFreq = 50;                 // 输出：信号频率（Hz）
    SignalAnalysisr_Reset_Inline(v); // 重置结构体
}
void SignalAnalysisr_Reset(SignalAnalysisr_Typedef *v) // 初始化结构体（带采样数限制）
{
    if (v == NULL)
        return;                      // 检查指针是否为 NULL
    SignalAnalysisr_Reset_Inline(v); // 重置结构体
}

static inline void SignalAnalysisr_Reset_Inline(SignalAnalysisr_Typedef *v) // 初始化结构体（带采样数限制）
{

    v->inv_nsamples = 1.0f / BUFFER_SIZE;
    v->buffer_size = BUFFER_SIZE;
    v->SigFreq = 50;                 // 输出：信号频率（Hz）
    v->curr_sign = 0;
    v->Threshold = 0; // 输入：零点检测阈值（绝对值低于此值视为负半周）
    v->delay_samples = 0;
    v->write_index = 0;
    v->Vrms = 0;             //  输出：电压有效值（RMS）
    v->prev_sign = 0;        // 内部：前一次采样的符号（0负/1正）
    v->curr_sign = 0;        // 内部：当前采样的符号（0负/1正）
    v->nsamples = 0;         // 内部：当前周期内的采样数
    v->Vacc_rms = 0;         // 累积的平方和值（用于计算 Vrms）本质上是一个中间变量
    v->curr_sample_norm = 0; // 当前采样值的归一化值（curr_sample_norm）
}

// 获取移相后的输出
// float PhaseShifter_GetOutput(PhaseShifter *v)
// {
//     // 计算需要读取的位置(带小数部分)
//     float read_pos = v->write_index - v->delay_samples;
//     // 处理负索引
//     while (read_pos < 0)
//         read_pos += BUFFER_SIZE;

//     // 分离整数和小数部分
//     uint16_t index = (uint16_t)read_pos;
//     float    frac = read_pos - index;

//     // 环形缓冲区索引计算
//     uint16_t idx0 = index & (BUFFER_SIZE - 1);
//     uint16_t idx1 = (index + 1) & (BUFFER_SIZE - 1);
//     // 线性插值(提高精度)
//     return ((1.0f - frac) * v->buffer[idx0]) + (frac * v->buffer[idx1]);
// }
